From 19c1c11322baa4fc8a1314b6550665414fdc4f60 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Mon, 10 Aug 2009 15:35:33 +0200 Subject: [PATCH] Don't invalidate unnecessary areas on raise We used to invalidate the whole window when raised, but this is unnecessary much, we now just invalidate the visible area minus the previously visible area. This also fixes a problem where expose calling raise caused a loop (#588438) --- gdk/gdkwindow.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index fc0a2379ae..63e5d7d85b 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -5978,6 +5978,7 @@ void gdk_window_raise (GdkWindow *window) { GdkWindowObject *private; + GdkRegion *old_region, *new_region; g_return_if_fail (GDK_IS_WINDOW (window)); @@ -5985,12 +5986,26 @@ gdk_window_raise (GdkWindow *window) if (private->destroyed) return; + old_region = NULL; + if (gdk_window_is_viewable (window) && + !private->input_only) + old_region = gdk_region_copy (private->clip_region); + /* Keep children in (reverse) stacking order */ gdk_window_raise_internal (window); recompute_visible_regions (private, TRUE, FALSE); - gdk_window_invalidate_rect (window, NULL, TRUE); + if (old_region) + { + new_region = gdk_region_copy (private->clip_region); + + gdk_region_subtract (new_region, old_region); + gdk_window_invalidate_region (window, new_region, TRUE); + + gdk_region_destroy (old_region); + gdk_region_destroy (new_region); + } } static void -- 2.30.2